﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace monitor2._0
{
    class ExecuteCmd
    {
        //ip ipconfig | find /i "IPv4 地址"
        public static String GetIp()
        {
            String result = null;//cmd执行结果
            String command = "ipconfig | find /i \"IPv4 地址\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            //这里可能获取到多个,每行是一个IP，取第一个即可
            if (result != null && result != "")
            {
                //获取第一行的IP
                string newLine = Environment.NewLine;
                result = result.Remove(result.IndexOf(newLine), newLine.Length);
                string[] arr = Regex.Split(result, newLine, RegexOptions.IgnoreCase);
                result = arr[0];
                //获取IP
                arr = Regex.Split(result, " : ", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                result = result.Trim();
            }
            return result;
        }
        //os_name 操作系统 systeminfo | find /i "OS 名称"
        public static String GetOsName()
        {
            String result = null;//cmd执行结果
            String command = "systeminfo | find /i \"OS 名称\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                string[] arr = Regex.Split(result, ":", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                //result.TrimStart();
                //result.TrimEnd();
                result = result.Trim();
            }
            return result;
        }
        //os_arch 系统架构 systeminfo | find /i "系统类型"
        public static String GetOsArch()
        {
            String result = null;//cmd执行结果
            String command = "systeminfo | find /i \"系统类型\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                string[] arr = Regex.Split(result, ":", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                //result.TrimStart();
                //result.TrimEnd();
                result = result.Trim();
            }
            return result;
        }
        //host_name 主机名 systeminfo | find /i "主机名"
        public static String GetHostName()
        {
            String result = null;//cmd执行结果
            String command = "systeminfo | find /i \"主机名\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                string[] arr = Regex.Split(result, ":", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                //result.TrimStart();
                //result.TrimEnd();
                result = result.Trim();
            }
            return result;
        }
        //physical_processor 物理核心 wmicwmic cpu get NumberOfCores
        public static String GetPhysicalProcessor()
        {
            String result = null;//cmd执行结果
            String command = "wmic cpu get NumberOfCores";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                result = Regex.Replace(result, "NumberOfCores", Environment.NewLine);
                //去除前后空格
                result = result.Trim();
            }
            return result;
        }
        //cpu_free 获取cpu 空闲 wmic cpu get loadpercentage
        public static String GetCpuFree()
        {
            String result = null;//cmd执行结果
            String command = "wmic cpu get loadpercentage";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                result = Regex.Replace(result, "LoadPercentage", Environment.NewLine);
                //去除前后空格
                result = result.Trim();
            }
            return result;
        }
        //mem_total 总内存 systeminfo | find /i "物理内存总量"
        public static String GetMemTotal()
        {
            String result = null;//cmd执行结果
            String command = "systeminfo | find /i \"物理内存总量\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                string[] arr = Regex.Split(result, ":", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                //result.TrimStart();
                //result.TrimEnd();
                result = result.Trim();
            }
            return result;
        }
        //mem_free 可用内存 systeminfo | find /i "可用的物理内存"
        public static String GetMemFree()
        {
            String result = null;//cmd执行结果
            String command = "systeminfo | find /i \"可用的物理内存\"";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                string[] arr = Regex.Split(result, ":", RegexOptions.IgnoreCase);
                result = arr[1];
                //去除前后空格
                //result.TrimStart();
                //result.TrimEnd();
                result = result.Trim();
            }
            return result;
        }

        //disk_data 全部磁盘信息 Wmic logicaldisk
        //Caption[说明文字];Description[描述];DeviceID[设备ID];Size[大小];FreeSpace[可用空间]
        public static String GetDiskData()
        {
            String result = null;//cmd执行结果
            String command = "wmic logicaldisk get Name,Caption,DeviceID,Size,FreeSpace";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                result = EncodeBase64(result.Trim());//数据结构很复杂，进行base64加密，然后传输
            }
            return result;
        }

        //process_data 全部进程信息 wmic process list brief
        public static String GetDiskProcess()
        {
            String result = null;//cmd执行结果
            String command = "wmic process where \"name like '%java%'\" get Name,ProcessId,CSName,Handle,VirtualSize";//cmd命令
            result = Cmd(command); ;//cmd执行结果
            //命令是否返回了执行结果，如果执行了返回结果，则进行处理
            if (result != null && result != "")
            {
                result = EncodeBase64(result.Trim());//数据结构很复杂，进行base64加密，然后传输
            }
            return result;
        }

        //执行cmd命令并返回结果
        private static string Cmd(String command)               //向cmd（）传入命令行，传入"exit"则退出cmd.exe。
        {
            Process process = new Process();
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.UseShellExecute = false;                  //这里是关键点,不用Shell启动
            process.StartInfo.RedirectStandardInput = true;             //重定向输入
            process.StartInfo.RedirectStandardOutput = true;            //重定向输出
            process.StartInfo.CreateNoWindow = true;                    //不显示窗口
            process.Start();
            process.StandardInput.WriteLine(command + "&exit");// 向cmd.exe输入command
            process.StandardInput.AutoFlush = true;
            String result = process.StandardOutput.ReadToEnd();// 得到cmd.exe的输出
            process.WaitForExit();
            process.Close();

            //处理命令结果,返回内容包含了执行结果的前后文，这里进行处理，只保留命令执行结果。
            if (result != null && result != "")
            {
                //string[] arr = result.Split('&exit');
                string[] arr = Regex.Split(result, "&exit", RegexOptions.IgnoreCase);
                if (arr != null && arr.Length > 1)
                {
                    result = arr[1];
                }
                else
                {
                    result = "";
                }
            }
            return result;
        }

        //编码
        private static string EncodeBase64(string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding("utf-8").GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }

        //解码
        private static string DecodeBase64(string code)
        {
            string decode = "";
            byte[] bytes = Convert.FromBase64String(code);
            try
            {
                decode = Encoding.GetEncoding("utf-8").GetString(bytes);
            }
            catch
            {
                decode = code;
            }
            return decode;
        }
    }
}
